package cn.hybrid.read.zf;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ReadTxtByFileReader {

    /**
     * FileReader 接口提供了一个异步的API，通过这个API可以从浏览器主线程中异步访问文件系统中的数据，基于此原因，FileReader 接口可以读取文件中的数据，并将读取的数据放入内存中。
     *
     * 当访问不同文件时，必须重新调用FileReader 接口的构造函数，因为每调用一次，FileReader 接口都将返回一个新的FileReader对象，只有这样，才能实现访问不同文件的数据
     */


    public static String loopCharReadByFileReader(String filePath){
        // 读取文件的方式一：逐个字符来读取文本文件
        StringBuilder res = new StringBuilder();
        FileReader fr = null;
        try {
            fr = new FileReader(filePath);

            int ch = fr.read();
            while (ch != -1) {
//                System.out.print((char) ch);
                res.append((char) ch);
                ch = fr.read();
            }
//            System.out.println();
        } catch (IOException e) {
            System.out.println("异常：" + e.toString());
        } finally {
            try {
                if (fr != null)
                    fr.close();
            } catch (IOException e) {
                System.out.println("异常：" + e.toString());
            }

        }
        return res.toString();
    }

    public static String loopCharArrayReadByFileReader(String filePath){
        StringBuilder res = new StringBuilder();
        //读取文件方式二：使用数组来读取文本文件
        FileReader fr1 = null;
        try {
            fr1 = new FileReader(filePath);
            char [] buf = new char[1024];
            int num = 0;
            while((num = fr1.read(buf))!=-1) {
                res.append(new String(buf,0,num));
//                System.out.println(new String(buf,0,num));
            }
        }catch(IOException e) {
            System.out.println("异常：" + e.toString());
        }finally {
            try {
                if(fr1!=null)
                    fr1.close();
            }catch(IOException e) {
                System.out.println("异常：" + e.toString());
            }
        }
        return res.toString();
    }


    /**
     * 不会保留txt文本的换行和空行
     *
     * @param filePath txt文件全路径
     * @return 字符串
     */
    public static String loopReadByBufferedReaderAndFileReader(String filePath){
        StringBuilder res = new StringBuilder();

        //方法三：用缓冲区读取文本文件
        //通过查源码得知方法三内部实现时是使用数组形式来缓冲字符数据的
        FileReader fr2 = null;
        BufferedReader bufr = null;
        try {
            fr2 = new FileReader(filePath);
            bufr = new BufferedReader(fr2);
            String line = null;
            //BufferedReader提供了按行读取文本文件的方法readLine()
            //readLine()返回行有效数据，不包含换行符，未读取到数据返回null
            while((line = bufr.readLine())!=null) {
//                System.out.println(line);
                res.append(line);
            }
        }catch(IOException e) {
            System.out.println("异常：" + e.toString());
        }finally {
            try {
                if(bufr!=null)
                    bufr.close();
            }catch(IOException e) {
                System.out.println("异常：" + e.toString());
            }
        }
        return  res.toString();
    }



}
